/**
 * 全局的异常处理，
 */
define(function(){
	window.ExceptionHandler = {
		//标记某个请求是否发生异常
		error: {},
		//异常处理
		handleError: function(conn, response, options){
			if (!response || !response.responseText)
				return ;
			var isError = false,
				title = '出错提示',
				resultText = response.responseText.trim();
			try{
				//先假设返回结果为json
				var result = Ext.decode(resultText);
				if (result.errorType == 'no-authc'){
					//访问被拒绝，总是认为由登陆失效引起，这点在做身份验证时要特别注意
					cu.hint('登陆失效，即将重新登陆...', function(){
						location.href = location.href;
					}, 200);
				}
				else if (result.errorType == 'app'){ //应用异常，为应用的提示信息
					if (!options.hasFailureFn){ //没有自定义出错处理方法则采用默认出错处理
						cu.showMsg(title, result.errorMsg, 'w');
					}
				}
				else if (result.errorMsg && !result.errorStack){ //发生了意外错误但没有异常栈
					cu.showMsg(title, '<font color="red">' + result.errorMsg + '</font>', 'e');
				}
				else if (result.errorMsg && result.errorStack){ //发生了意外错误并且有异常栈
					showErrorWin(result.errorMsg, result.errorStack, title);
				}
				isError = (result.errorType || result.errorMsg);
			}
			catch(ex){
				//如果返回结果不是json，并且有<html>标志，认为是错误页面
				//（这样的处理有问题，以后应当修改。）
				if (resultText.indexOf('<html>') != -1 && resultText.indexOf('</html>') != -1){
					var win = new Ext.Window({
						title: '发生意外错误',
						width: 600, height: 400,
						html: '<iframe width="100%" height="100%" frameborder="0" scrolling="yes"></iframe>',
				        plain:true, modal: true,
				        bodyStyle:'padding:5px;', buttonAlign:'center', iconCls: 'icon-window',
				        listeners:{
							afterrender: function(){
								var iframe = this.getEl().query('iframe')[0];
								iframe.contentWindow.document.write(resultText);
							}
						},
				        buttons: [{text: '关闭', handler: function(){ win.close(); }}]
					});
					win.show();
					isError = true;
				}
			}
			if (isError && options){
				//标记发生异常，在CommonUtils.ajax()方法中会做相应的处理
				this.setError(options.ajaxNum);
			}
			return isError;
		},
		//设置指定序号的请求发生异常
		setError: function(ajaxNum){
			this.error[ajaxNum] = true;
		},
		//获取指定序号的请求是否异常，同时删除异常标记
		fetchError: function(ajaxNum){
			var err = this.error[ajaxNum];
			if (err){
				delete this.error[ajaxNum];
			}
			return err;
		}
	};
	
	var showErrorWin = function(errorMsg, errorStack, title){
		errorStack = errorStack.replace(/.*at /g, '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at ')
			.replace(/\n/g,'<br/>').replace(/(org\.sninwo\.faster\.[^\s]*)/g, '<font color="yellow">$1</font>')
			.replace(/(Cause by:)/g, '<strong><font color="blue">$1</font></strong>');
		var errorWin = new Ext.Window({
	        title: title || '内部错误',
	        layout: 'fit', plain:true, modal: true, bodyStyle:'padding:5px;', buttonAlign:'center',
	        items: [new Ext.FormPanel({
	       		baseCls: 'x-plain', labelWidth: 0,
	        	items:[{
	       			baseCls: 'x-plain', height: 60, bodyStyle: 'margin-bottom:5px',
	        		html:'<div class="icon-error" style="height:100%;padding-left:40px;"><div style="font-size:14px;color:red;margin-bottom:3px;">发生内部错误：</div>' + errorMsg + '</div>'
	        	},{
			        xtype: 'fieldset', title: '异常信息', autoHeight: false,  layout: 'form', collapsed: true, collapsible: true,
	    			items: {
	       				baseCls: 'x-plain',
	        			html:'<div style="width:100%;height:320px;font-size:14px;overflow:auto;background-color:#000;color:#33FF00;"><nobr>' + errorStack + '</nobr></div>'
	        		},
	        		listeners:{
	        			collapse: function(){
							errorWin.setWidth(400); 
							errorWin.setHeight(170); 
							errorWin.center();
						},
	        			expand: function(){
							errorWin.setWidth(cu.getWinWidth(800)); 
							errorWin.setHeight(cu.getWinHeight(500)); 
							errorWin.center();
	        			}
	        		}
	        	}]
	        })],
	        buttons: [{text: '关闭', handler: function(){ errorWin.close(); }}]
	    });
		errorWin.show();
	};
	
	/**
	 * 设置全局ajax提交前和完成后的处理。
	 * 每次提交请求前，将CommonUtils.ajaxError设置false。
	 * 每次请求完成后，如果发现错误则将CommonUtils.ajaxError设置为true，并进行出错提示。
	 */
	var ajaxNum = 0; //用来记得请求的序号
	Ext.Ajax.on('beforerequest', function(conn, options){
		options.ajaxNum = (++ajaxNum); //在options中记住请求序号，供处理异常使用
	});
	Ext.Ajax.on('requestcomplete', function(conn, response, options){
		cu.stopWaiting();
	});
	Ext.Ajax.on('requestexception', function(conn, response, options){
		cu.stopWaiting();
		ExceptionHandler.handleError(conn, response, options);
	});
});